WebAssembly ํ ์ด๋ธ ํ์ ์ ์ฝ์ ์ฌ์ธต ๋ถ์ํ์ฌ ํจ์ ํ ์ด๋ธ ํ์ ์์ ์ฑ์ ์ค์์ฑ, ๊ตฌํ ๋ฐ ์์ ํ๊ณ ํจ์จ์ ์ธ ์ฝ๋ ์คํ์ ์ํ ์ด์ ์ ์ค๋ช ํฉ๋๋ค.
WebAssembly ํ ์ด๋ธ ํ์ ์ ์ฝ: ํจ์ ํ ์ด๋ธ ํ์ ์์ ์ฑ ๋ณด์ฅ
WebAssembly(Wasm)๋ ๋ค์ํ ํ๋ซํผ์์ ๊ณ ์ฑ๋ฅ, ์ด์์ฑ, ๋ณด์์ฑ์ ๊ฐ์ถ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ํต์ฌ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. WebAssembly ์ํคํ ์ฒ์ ํต์ฌ ๊ตฌ์ฑ ์์๋ externref ๋๋ funcref ์์์ ๋์ ํฌ๊ธฐ ๋ฐฐ์ด์ธ ํ ์ด๋ธ์ ๋๋ค. ์ด๋ฌํ ํ ์ด๋ธ, ํนํ ํจ์ ํ ์ด๋ธ ๋ด์์ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ WebAssembly ๋ชจ๋์ ๋ฌด๊ฒฐ์ฑ๊ณผ ๋ณด์์ ์ ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ WebAssembly ํ ์ด๋ธ ํ์ ์ ์ฝ์ ๋ํด ๊น์ด ํ๊ณ ๋ค๋ฉฐ, ํนํ ํจ์ ํ ์ด๋ธ ํ์ ์์ ์ฑ, ๊ทธ ์ค์์ฑ, ๊ตฌํ ์ธ๋ถ ์ ๋ณด ๋ฐ ์ด์ ์ ์ด์ ์ ๋ง์ถฅ๋๋ค.
WebAssembly ํ ์ด๋ธ ์ดํดํ๊ธฐ
WebAssembly ํ ์ด๋ธ์ ๋ณธ์ง์ ์ผ๋ก ํจ์๋ ์ธ๋ถ(๋ถํฌ๋ช ) ๊ฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๋์ ๋ฐฐ์ด์ ๋๋ค. ์ด๋ ๋์ ๋์คํจ์น๋ฅผ ๋ฌ์ฑํ๊ณ WebAssembly ๋ชจ๋๊ณผ ํธ์คํธ ํ๊ฒฝ ๊ฐ์ ์ํธ ์์ฉ์ ์ด์งํ๋ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ํ ์ด๋ธ์๋ ๋ ๊ฐ์ง ์ฃผ์ ์ ํ์ด ์์ต๋๋ค:
- ํจ์ ํ ์ด๋ธ(funcref): ์ด ํ ์ด๋ธ์ WebAssembly ํจ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ํธ์ถํ ํจ์๊ฐ ๋ฐํ์์ ๊ฒฐ์ ๋๋ ๋์ ํจ์ ํธ์ถ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ธ๋ถ ์ฐธ์กฐ ํ ์ด๋ธ(externref): ์ด ํ ์ด๋ธ์ ํธ์คํธ ํ๊ฒฝ(์: ์น ๋ธ๋ผ์ฐ์ ์ JavaScript ๊ฐ์ฒด)์์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ ๋ํ ๋ถํฌ๋ช ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด WebAssembly ๋ชจ๋์ด ํธ์คํธ API ๋ฐ ์ธ๋ถ ๋ฐ์ดํฐ์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
ํ
์ด๋ธ์ ํ์
๊ณผ ํฌ๊ธฐ๋ก ์ ์๋ฉ๋๋ค. ํ์
์ ํ
์ด๋ธ์ ์ ์ฅํ ์ ์๋ ์์์ ์ข
๋ฅ(์: funcref ๋๋ externref)๋ฅผ ์ง์ ํฉ๋๋ค. ํฌ๊ธฐ๋ ํ
์ด๋ธ์ด ๋ณด์ ํ ์ ์๋ ์์์ ์ด๊ธฐ ๋ฐ ์ต๋ ๊ฐ์๋ฅผ ์ง์ ํฉ๋๋ค. ํฌ๊ธฐ๋ ๊ณ ์ ๋๊ฑฐ๋ ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ
์ด๋ธ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค (WAT, ์ฆ WebAssembly ํ
์คํธ ํ์):
(table $my_table (ref func) (i32.const 10) (i32.const 20))
์ด ์๋ $my_table์ด๋ผ๋ ์ด๋ฆ์ ํ
์ด๋ธ์ ์ ์ํ๋ฉฐ, ์ด ํ
์ด๋ธ์ ํจ์ ์ฐธ์กฐ(ref func)๋ฅผ ์ ์ฅํ๊ณ ์ด๊ธฐ ํฌ๊ธฐ๋ 10, ์ต๋ ํฌ๊ธฐ๋ 20์
๋๋ค. ํ
์ด๋ธ์ ์ต๋ ํฌ๊ธฐ๊น์ง ์ปค์ง ์ ์์ด ๊ฒฝ๊ณ ๋ฐ ์ ๊ทผ ๋ฐ ๋ฆฌ์์ค ๊ณ ๊ฐ์ ๋ฐฉ์งํฉ๋๋ค.
ํจ์ ํ ์ด๋ธ ํ์ ์์ ์ฑ์ ์ค์์ฑ
ํจ์ ํ ์ด๋ธ์ WebAssembly ๋ด์์ ๋์ ํจ์ ํธ์ถ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ ํ ํ์ ์ ์ฝ์ด ์์ผ๋ฉด ๋ณด์ ์ทจ์ฝ์ ์ ์์ธ์ด ๋ ์ ์์ต๋๋ค. WebAssembly ๋ชจ๋์ด ํจ์ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ํด๋น ์ธ๋ฑ์ค์ ํ ์ด๋ธ ํญ๋ชฉ์ ์์๋ ์๊ทธ๋์ฒ(์ฆ, ์ฌ๋ฐ๋ฅธ ๋งค๊ฐ๋ณ์ ๊ฐ์์ ํ์ , ๋ฐํ ๊ฐ)๋ฅผ ๊ฐ์ง ํจ์๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฉด, ํธ์ถ์ ์ ์๋์ง ์์ ๋์, ๋ฉ๋ชจ๋ฆฌ ์์ ๋๋ ์์ ์ฝ๋ ์คํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
ํ์ ์์ ์ฑ์ ํจ์ ํ ์ด๋ธ์ ํตํด ํธ์ถ๋ ํจ์๊ฐ ํธ์ถ์๊ฐ ๊ธฐ๋ํ๋ ์ฌ๋ฐ๋ฅธ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์ค์ํฉ๋๋ค:
- ๋ณด์: ๊ณต๊ฒฉ์๊ฐ ํจ์ ํ ์ด๋ธ ํญ๋ชฉ์ ๋ฌด๋จ ์์ ์ ์ํํ๋ ํจ์์ ๋ํ ์ฐธ์กฐ๋ก ๋ฎ์ด์จ์ ์ ์ฑ ์ฝ๋๋ฅผ ์ฃผ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ์์ ์ฑ: ํจ์ ํธ์ถ์ด ์์ธก ๊ฐ๋ฅํ๊ณ ์๊ธฐ์น ์์ ์ถฉ๋์ด๋ ์ค๋ฅ๋ก ์ด์ด์ง์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ ํ์ฑ: ์ฌ๋ฐ๋ฅธ ํจ์๊ฐ ์ฌ๋ฐ๋ฅธ ์ธ์๋ก ํธ์ถ๋๋๋ก ๋ณด์ฅํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์ฑ๋ฅ: WebAssembly ๋ฐํ์์ด ํ์ ์ ๋ณด๋ฅผ ์ ๋ขฐํ์ฌ ํจ์ ํธ์ถ์ ๋์์ ๋ํ ๊ฐ์ ์ ํ ์ ์์ผ๋ฏ๋ก ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
ํ ์ด๋ธ ํ์ ์ ์ฝ์ด ์๋ค๋ฉด WebAssembly๋ ๋ค์ํ ๊ณต๊ฒฉ์ ์ทจ์ฝํด์ ธ ๋ณด์์ ๋ฏผ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ถ์ ํฉํ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์์ ์ธ ํ์์๋ ํ ์ด๋ธ์ ํจ์ ํฌ์ธํฐ๋ฅผ ์์ ์ ์ ์ฑ ํจ์ ํฌ์ธํฐ๋ก ๋ฎ์ด์ธ ์ ์์ต๋๋ค. ์๋ ํจ์๊ฐ ํ ์ด๋ธ์ ํตํด ํธ์ถ๋ ๋ ๊ณต๊ฒฉ์์ ํจ์๊ฐ ๋์ ์คํ๋์ด ์์คํ ์ ์์์ํฌ ์ ์์ต๋๋ค. ์ด๋ C/C++์ ๊ฐ์ ๋ค์ดํฐ๋ธ ์ฝ๋ ์คํ ํ๊ฒฝ์์ ๋ณผ ์ ์๋ ํจ์ ํฌ์ธํฐ ์ทจ์ฝ์ ๊ณผ ์ ์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ ฅํ ํ์ ์์ ์ฑ์ ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค.
WebAssembly ํ์ ์์คํ ๊ณผ ํจ์ ์๊ทธ๋์ฒ
WebAssembly๊ฐ ํจ์ ํ ์ด๋ธ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ค๋ฉด WebAssembly ํ์ ์์คํ ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. WebAssembly๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ๋ ๊ธฐ๋ณธ ํ์ ์ ์ง์ํฉ๋๋ค:
- i32: 32๋นํธ ์ ์
- i64: 64๋นํธ ์ ์
- f32: 32๋นํธ ๋ถ๋ ์์์ ์
- f64: 64๋นํธ ๋ถ๋ ์์์ ์
- v128: 128๋นํธ ๋ฒกํฐ (SIMD ํ์ )
- funcref: ํจ์์ ๋ํ ์ฐธ์กฐ
- externref: ์ธ๋ถ ๊ฐ์ ๋ํ ์ฐธ์กฐ (๋ถํฌ๋ช )
WebAssembly์ ํจ์๋ ํน์ ์๊ทธ๋์ฒ๋ก ์ ์๋๋ฉฐ, ์ด๋ ๋งค๊ฐ๋ณ์์ ํ์
๊ณผ ๋ฐํ ๊ฐ์ ํ์
(๋๋ ๋ฐํ ๊ฐ ์์)์ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ๊ฐ์ i32 ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ i32 ๊ฐ์ ๋ฐํํ๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง๋๋ค (WAT์์):
(func $add (param i32 i32) (result i32)
(i32.add (local.get 0) (local.get 1))
)
$add๋ผ๋ ์ด๋ฆ์ ์ด ํจ์๋ ๋ ๊ฐ์ 32๋นํธ ์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ 32๋นํธ ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. WebAssembly ํ์
์์คํ
์ ํจ์ ํธ์ถ์ด ์ ์ธ๋ ์๊ทธ๋์ฒ๋ฅผ ์ค์ํ๋๋ก ๊ฐ์ ํฉ๋๋ค. ๋ง์ฝ ํจ์๊ฐ ์๋ชป๋ ํ์
์ ์ธ์๋ก ํธ์ถ๋๊ฑฐ๋ ์๋ชป๋ ํ์
์ ๊ฐ์ ๋ฐํํ๋ ค๊ณ ํ๋ฉด, WebAssembly ๋ฐํ์์ ํ์
์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ณ ์คํ์ ์ค๋จํฉ๋๋ค. ์ด๋ ํ์
๊ด๋ จ ์ค๋ฅ๊ฐ ์ ํ๋์ด ์ ์ฌ์ ์ผ๋ก ๋ณด์ ์ทจ์ฝ์ ์ ์ ๋ฐํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
ํ ์ด๋ธ ํ์ ์ ์ฝ: ์๊ทธ๋์ฒ ํธํ์ฑ ๋ณด์ฅ
WebAssembly๋ ํ ์ด๋ธ ํ์ ์ ์ฝ์ ํตํด ํจ์ ํ ์ด๋ธ ํ์ ์์ ์ฑ์ ๊ฐ์ ํฉ๋๋ค. ํจ์๊ฐ ํจ์ ํ ์ด๋ธ์ ๋ฐฐ์น๋ ๋, WebAssembly ๋ฐํ์์ ํด๋น ํจ์์ ์๊ทธ๋์ฒ๊ฐ ํ ์ด๋ธ์ ์์ ํ์ ๊ณผ ํธํ๋๋์ง ํ์ธํฉ๋๋ค. ์ด ํธํ์ฑ ๊ฒ์ฌ๋ ํ ์ด๋ธ์ ํตํด ํธ์ถ๋๋ ๋ชจ๋ ํจ์๊ฐ ์์๋ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋๋ก ๋ณด์ฅํ์ฌ ํ์ ์ค๋ฅ์ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํฉ๋๋ค.
์ด ํธํ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ๋ ์ฌ๋ฌ ๋ฉ์ปค๋์ฆ์ด ๊ธฐ์ฌํฉ๋๋ค:
- ๋ช ์์ ํ์ ์ด๋ ธํ ์ด์ : WebAssembly๋ ํจ์ ๋งค๊ฐ๋ณ์์ ๋ฐํ ๊ฐ์ ๋ํ ๋ช ์์ ํ์ ์ด๋ ธํ ์ด์ ์ ์๋ฌดํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐํ์์ ํจ์ ํธ์ถ์ด ์ ์ธ๋ ์๊ทธ๋์ฒ๋ฅผ ์ค์ํ๋์ง ์ ์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
- ํจ์ ํ
์ด๋ธ ์ ์: ํจ์ ํ
์ด๋ธ์ด ์์ฑ๋ ๋, ํจ์ ์ฐธ์กฐ(
funcref) ๋๋ ์ธ๋ถ ์ฐธ์กฐ(externref)๋ฅผ ์ ์ฅํ๋๋ก ์ ์ธ๋ฉ๋๋ค. ์ด ์ ์ธ์ ํ ์ด๋ธ์ ์ ์ฅ๋ ์ ์๋ ๊ฐ์ ํ์ ์ ์ ํํฉ๋๋ค. ํธํ๋์ง ์๋ ํ์ ์ ๊ฐ์ ์ ์ฅํ๋ ค๊ณ ํ๋ฉด ๋ชจ๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋๋ ์ธ์คํด์คํ ์ค์ ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. - ๊ฐ์ ํจ์ ํธ์ถ: ํจ์ ํ
์ด๋ธ์ ํตํด ๊ฐ์ ํจ์ ํธ์ถ์ด ์ด๋ฃจ์ด์ง ๋, WebAssembly ๋ฐํ์์ ํธ์ถ๋๋ ํจ์์ ์๊ทธ๋์ฒ๊ฐ
call_indirect๋ช ๋ น์ด์ ์ํด ์ง์ ๋ ์์ ์๊ทธ๋์ฒ์ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค.call_indirect๋ช ๋ น์ด๋ ํน์ ํจ์ ์๊ทธ๋์ฒ๋ฅผ ์ฐธ์กฐํ๋ ํ์ ์ธ๋ฑ์ค๋ฅผ ํ์๋ก ํฉ๋๋ค. ๋ฐํ์์ ์ด ์๊ทธ๋์ฒ๋ฅผ ํ ์ด๋ธ์ ์ง์ ๋ ์ธ๋ฑ์ค์ ์๋ ํจ์์ ์๊ทธ๋์ฒ์ ๋น๊ตํฉ๋๋ค. ์๊ทธ๋์ฒ๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ค์ ์์ ๋ฅผ ๊ณ ๋ คํด ๋ณด์ญ์์ค (WAT์์):
(module
(type $sig (func (param i32 i32) (result i32)))
(table $my_table (ref $sig) (i32.const 1))
(func $add (type $sig) (param i32 i32) (result i32)
(i32.add (local.get 0) (local.get 1))
)
(func $main (export "main") (result i32)
(call_indirect (type $sig) (i32.const 0))
)
(elem (i32.const 0) $add)
)
์ด ์์ ์์๋ ๋ ๊ฐ์ i32 ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ i32๋ฅผ ๋ฐํํ๋ ํจ์ ์๊ทธ๋์ฒ $sig๋ฅผ ์ ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ $sig ํ์
์ ํจ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋๋ก ์ ์ฝ๋ ํจ์ ํ
์ด๋ธ $my_table์ ์ ์ํฉ๋๋ค. $add ํจ์๋ ์๊ทธ๋์ฒ $sig๋ฅผ ๊ฐ์ง๋๋ค. elem ์ธ๊ทธ๋จผํธ๋ ํ
์ด๋ธ์ $add ํจ์๋ก ์ด๊ธฐํํฉ๋๋ค. $main ํจ์๋ ํ์
์๊ทธ๋์ฒ $sig๋ฅผ ์ฌ์ฉํ์ฌ call_indirect๋ก ํ
์ด๋ธ์ ์ธ๋ฑ์ค 0์ ์๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ธ๋ฑ์ค 0์ ์๋ ํจ์๊ฐ ์ฌ๋ฐ๋ฅธ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํธ์ถ์ ์ ํจํฉ๋๋ค.
๋ง์ฝ ๋ค๋ฅธ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ํ
์ด๋ธ์ ๋ฃ์ผ๋ ค๊ณ ํ๊ฑฐ๋ call_indirect๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์๊ทธ๋์ฒ๋ก ํจ์๋ฅผ ํธ์ถํ๋ ค๊ณ ํ๋ฉด, WebAssembly ๋ฐํ์์ ํ์
์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ๊ฒ์
๋๋ค.
WebAssembly ์ปดํ์ผ๋ฌ ๋ฐ VM์์์ ๊ตฌํ ์ธ๋ถ ์ ๋ณด
WebAssembly ์ปดํ์ผ๋ฌ์ ๊ฐ์ ๋จธ์ (VM)์ ํ ์ด๋ธ ํ์ ์ ์ฝ์ ๊ฐ์ ํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ ํน์ ์ปดํ์ผ๋ฌ์ VM์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ง๋ง, ์ผ๋ฐ์ ์ธ ์์น์ ๋์ผํฉ๋๋ค:
- ์ ์ ๋ถ์: WebAssembly ์ปดํ์ผ๋ฌ๋ ์ฝ๋์ ์ ์ ๋ถ์์ ์ํํ์ฌ ํ ์ด๋ธ ์ ๊ทผ๊ณผ ๊ฐ์ ํธ์ถ์ด ํ์ ์์ ํ์ง ํ์ธํฉ๋๋ค. ์ด ๋ถ์์๋ ํธ์ถ๋ ํจ์์ ์ ๋ฌ๋ ์ธ์์ ํ์ ์ด ํจ์ ์๊ทธ๋์ฒ์ ์ ์๋ ์์ ํ์ ๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ ๊ณผ์ ์ด ํฌํจ๋ฉ๋๋ค.
- ๋ฐํ์ ๊ฒ์ฌ: ์ ์ ๋ถ์ ์ธ์๋ WebAssembly VM์ ์คํ ์ค์ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค. ์ด๋ฌํ ๊ฒ์ฌ๋ ๋์ ํจ์๊ฐ ํ ์ด๋ธ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐํ์์ ๊ฒฐ์ ๋๋ ๊ฐ์ ํธ์ถ์ ํนํ ์ค์ํฉ๋๋ค. ๋ฐํ์์ ํธ์ถ์ ์คํํ๊ธฐ ์ ์ ์ง์ ๋ ์ธ๋ฑ์ค์ ํจ์๊ฐ ์ฌ๋ฐ๋ฅธ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ: WebAssembly VM์ ํ ์ด๋ธ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ๋ฌด๋จ ์ ๊ทผ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ณต๊ฒฉ์๊ฐ ํจ์ ํ ์ด๋ธ ํญ๋ชฉ์ ์ ์ฑ ์ฝ๋๋ก ๋ฎ์ด์ฐ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
์๋ฅผ ๋ค์ด, WebAssembly VM์ ํฌํจํ๋ V8 JavaScript ์์ง์ ์๊ฐํด ๋ณด์ญ์์ค. V8์ ํจ์ ํ ์ด๋ธ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์ ๋ถ์๊ณผ ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ๋ชจ๋ ์ํํฉ๋๋ค. ์ปดํ์ผ ์ค์ V8์ ๋ชจ๋ ๊ฐ์ ํธ์ถ์ด ํ์ ์์ ํ์ง ํ์ธํฉ๋๋ค. ๋ฐํ์์ V8์ ์ ์ฌ์ ์ธ ์ทจ์ฝ์ ์ผ๋ก๋ถํฐ ๋ณดํธํ๊ธฐ ์ํด ์ถ๊ฐ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก SpiderMonkey(Firefox์ JavaScript ์์ง) ๋ฐ JavaScriptCore(Safari์ JavaScript ์์ง)์ ๊ฐ์ ๋ค๋ฅธ WebAssembly VM๋ ํ์ ์์ ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ ์ฌํ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค.
ํ ์ด๋ธ ํ์ ์ ์ฝ์ ์ด์
WebAssembly์์ ํ ์ด๋ธ ํ์ ์ ์ฝ์ ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ง์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค:
- ํฅ์๋ ๋ณด์: ์ฝ๋ ์ฃผ์ ์ด๋ ์์ ์ฝ๋ ์คํ์ผ๋ก ์ด์ด์ง ์ ์๋ ํ์ ๊ด๋ จ ์ทจ์ฝ์ ์ ๋ฐฉ์งํฉ๋๋ค.
- ๊ฐ์ ๋ ์์ ์ฑ: ํ์ ๋ถ์ผ์น๋ก ์ธํ ๋ฐํ์ ์ค๋ฅ ๋ฐ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ ๋๋ค.
- ํฅ์๋ ์ฑ๋ฅ: WebAssembly ๋ฐํ์์ด ํ์ ์ ๋ณด๋ฅผ ์ ๋ขฐํ์ฌ ํจ์ ํธ์ถ์ ๋์์ ๋ํ ๊ฐ์ ์ ํ ์ ์์ผ๋ฏ๋ก ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋จ์ํ๋ ๋๋ฒ๊น : ๊ฐ๋ฐ ์ค์ ํ์ ๊ด๋ จ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ ์์ ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ํฅ์๋ ์ด์์ฑ: WebAssembly ๋ชจ๋์ด ๋ค๋ฅธ ํ๋ซํผ๊ณผ VM์์ ์ผ๊ด๋๊ฒ ๋์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ค์ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ๊ฒฌ๊ณ ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๊ธฐ์ฌํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฒ ๋๋ ์์คํ ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ํฉํ ํ๋ซํผ์ผ๋ก ๋ง๋ญ๋๋ค.
์ค์ ์ฌ๋ก ๋ฐ ์ฌ์ฉ ์์
ํ ์ด๋ธ ํ์ ์ ์ฝ์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ค์ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ ๋๋ค:
- ์น ์ ํ๋ฆฌ์ผ์ด์ : WebAssembly๋ ๊ฒ์, ์๋ฎฌ๋ ์ด์ , ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋๊ตฌ์ ๊ฐ์ ๊ณ ์ฑ๋ฅ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ์ ๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ํ ์ด๋ธ ํ์ ์ ์ฝ์ ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ์ฌ ์ฌ์ฉ์๋ฅผ ์ ์ฑ ์ฝ๋๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค.
- ์๋ฒ ๋๋ ์์คํ : WebAssembly๋ IoT ์ฅ์น ๋ฐ ์๋์ฐจ ์์คํ ๊ณผ ๊ฐ์ ์๋ฒ ๋๋ ์์คํ ์์๋ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ์ด๋ฌํ ํ๊ฒฝ์์๋ ๋ณด์๊ณผ ์ ๋ขฐ์ฑ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ํ ์ด๋ธ ํ์ ์ ์ฝ์ ์ด๋ฌํ ์ฅ์น์์ ์คํ๋๋ WebAssembly ๋ชจ๋์ด ์์๋ ์ ์๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํด๋ผ์ฐ๋ ์ปดํจํ : WebAssembly๋ ํด๋ผ์ฐ๋ ์ปดํจํ ํ๊ฒฝ์ ์ํ ์๋๋ฐ์ฑ ๊ธฐ์ ๋ก ํ์๋๊ณ ์์ต๋๋ค. ํ ์ด๋ธ ํ์ ์ ์ฝ์ WebAssembly ๋ชจ๋์ ์คํํ๊ธฐ ์ํ ์์ ํ๊ณ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ ์ ๊ณตํ์ฌ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ํธ์คํธ ์ด์ ์ฒด์ ์ ๊ฐ์ญํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ธ๋ก์ฒด์ธ ๊ธฐ์ : ์ผ๋ถ ๋ธ๋ก์ฒด์ธ ํ๋ซํผ์ ๊ฒฐ์ ๋ก ์ ํน์ฑ๊ณผ ํ ์ด๋ธ ํ์ ์์ ์ฑ์ ํฌํจํ ๋ณด์ ๊ธฐ๋ฅ ๋๋ฌธ์ ์ค๋งํธ ๊ณ์ฝ ์คํ์ WebAssembly๋ฅผ ํ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, WebAssembly๋ก ์์ฑ๋ ์น ๊ธฐ๋ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด ๋ณด์ญ์์ค. ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. ํ ์ด๋ธ ํ์ ์ ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ํจํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ํจ์๋ง ํธ์ถํ ์ ์๋๋ก ๋ณด์ฅํ์ฌ ์ ์ฑ ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
ํฅํ ๋ฐฉํฅ ๋ฐ ๊ฐ์ ์ฌํญ
WebAssembly ์ปค๋ฎค๋ํฐ๋ WebAssembly์ ๋ณด์๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ง์์ ์ผ๋ก ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ํ ์ด๋ธ ํ์ ์ ์ฝ๊ณผ ๊ด๋ จ๋ ํฅํ ๋ฐฉํฅ ๋ฐ ๊ฐ์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์๋ธํ์ดํ: ํจ์ ์๊ทธ๋์ฒ์ ๋ํ ์๋ธํ์ดํ ์ง์ ๊ฐ๋ฅ์ฑ์ ํ์ํ์ฌ ๋ ์ ์ฐํ ํ์ ๊ฒ์ฌ๋ฅผ ํ์ฉํ๊ณ ๋ ๋ณต์กํ ์ฝ๋ ํจํด์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋ ํํ๋ ฅ ์๋ ํ์ ์์คํ : ํจ์์ ๋ฐ์ดํฐ ๊ฐ์ ๋ ๋ณต์กํ ๊ด๊ณ๋ฅผ ํฌ์ฐฉํ ์ ์๋ ๋ ํํ๋ ฅ ์๋ ํ์ ์์คํ ์ ์ฐ๊ตฌํฉ๋๋ค.
- ํ์ ๊ฒ์ฆ: WebAssembly ๋ชจ๋์ ์ ํ์ฑ์ ์ฆ๋ช ํ๊ณ ํ์ ์ ์ฝ์ ์ค์ํ๋์ง ํ์ธํ๊ธฐ ์ํ ํ์ ๊ฒ์ฆ ๊ธฐ์ ์ ๊ฐ๋ฐํฉ๋๋ค.
์ด๋ฌํ ๊ฐ์ ์ฌํญ์ WebAssembly์ ๋ณด์๊ณผ ์ ๋ขฐ์ฑ์ ๋์ฑ ๊ฐํํ์ฌ ๊ณ ์ฑ๋ฅ, ์ด์์ฑ, ๋ณด์์ฑ์ ๊ฐ์ถ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ์ ๋์ฑ ๋งค๋ ฅ์ ์ธ ํ๋ซํผ์ผ๋ก ๋ง๋ค ๊ฒ์ ๋๋ค.
WebAssembly ํ ์ด๋ธ ์์ ๋ชจ๋ฒ ์ฌ๋ก
WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด ํ ์ด๋ธ ์์ ์ ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- ํญ์ ๋ช ์์ ํ์ ์ด๋ ธํ ์ด์ ์ฌ์ฉ: ํจ์ ๋งค๊ฐ๋ณ์์ ๋ฐํ ๊ฐ์ ํ์ ์ ๋ช ํํ๊ฒ ์ ์ํ์ญ์์ค.
- ํจ์ ํ ์ด๋ธ ํ์ ์ ์ ์คํ๊ฒ ์ ์: ํจ์ ํ ์ด๋ธ ํ์ ์ด ํ ์ด๋ธ์ ์ ์ฅ๋ ํจ์์ ์๊ทธ๋์ฒ๋ฅผ ์ ํํ๊ฒ ๋ฐ์ํ๋๋ก ํ์ญ์์ค.
- ์ธ์คํด์คํ ์ค ํจ์ ํ ์ด๋ธ ์ ํจ์ฑ ๊ฒ์ฌ: ํจ์ ํ ์ด๋ธ์ด ์์๋ ํจ์๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ธฐํ๋์๋์ง ํ์ธํ์ญ์์ค.
- ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๋ฉ์ปค๋์ฆ ์ฌ์ฉ: ํ ์ด๋ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฌด๋จ ์ ๊ทผ์ผ๋ก๋ถํฐ ๋ณดํธํ์ญ์์ค.
- WebAssembly ๋ณด์ ๊ถ๊ณ ์ฌํญ ์ต์ ์ํ ์ ์ง: ์๋ ค์ง ์ทจ์ฝ์ ์ ๋ํด ์ธ์งํ๊ณ ํจ์น๋ฅผ ์ ์ํ๊ฒ ์ ์ฉํ์ญ์์ค.
- ์ ์ ๋ถ์ ๋๊ตฌ ํ์ฉ: WebAssembly ์ฝ๋์ ์ ์ฌ์ ์ธ ํ์ ์ค๋ฅ์ ๋ณด์ ์ทจ์ฝ์ ์ ์๋ณํ๋๋ก ์ค๊ณ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๋ง์ ๋ฆฐํฐ์ ์ ์ ๋ถ์๊ธฐ๊ฐ ์ด์ WebAssembly๋ฅผ ์ง์ํฉ๋๋ค.
- ์ฒ ์ ํ ํ ์คํธ: ํผ์ง์ ํฌํจํ ํฌ๊ด์ ์ธ ํ ์คํธ๋ ํจ์ ํ ์ด๋ธ๊ณผ ๊ด๋ จ๋ ์๊ธฐ์น ์์ ๋์์ ๋ฐ๊ฒฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ ๊ด๋ จ ์ค๋ฅ ๋ฐ ๋ณด์ ์ทจ์ฝ์ ์ ์ํ์ ์ต์ํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
WebAssembly ํ ์ด๋ธ ํ์ ์ ์ฝ์ ํจ์ ํ ์ด๋ธ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ ์ค์ํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์๊ทธ๋์ฒ ํธํ์ฑ์ ๊ฐ์ ํ๊ณ ํ์ ๊ด๋ จ ์ทจ์ฝ์ ์ ๋ฐฉ์งํจ์ผ๋ก์จ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์, ์์ ์ฑ ๋ฐ ์ฑ๋ฅ์ ํฌ๊ฒ ๊ธฐ์ฌํฉ๋๋ค. WebAssembly๊ฐ ๊ณ์ ๋ฐ์ ํ๊ณ ์๋ก์ด ์์ญ์ผ๋ก ํ์ฅ๋จ์ ๋ฐ๋ผ ํ ์ด๋ธ ํ์ ์ ์ฝ์ ๋ณด์ ์ํคํ ์ฒ์ ๊ธฐ๋ณธ ์ธก๋ฉด์ผ๋ก ๋จ์ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ ์ฝ์ ์ดํดํ๊ณ ํ์ฉํ๋ ๊ฒ์ ๊ฒฌ๊ณ ํ๊ณ ์ ๋ขฐํ ์ ์๋ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๊ณ WebAssembly ๋ณด์์ ์ต์ ๊ฐ๋ฐ ๋ํฅ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ ์ฌ์ ์ธ ์ํ์ ์ํํ๋ฉด์ WebAssembly์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.